/**
 * 20210317
 * 该common.js用于处理H5端 聊天或通知等实时消息，
 * 若Android或iOS处理实时消息，需要新建另一个js文件用来存放关于APP端的相关方法，同事App.vue文件里的相关方法或字段也要注意区分不同端的使用
 *
 * APP端对应的方法建议放在"@/common/websocketApp/common.js"下，存储等方法名尽量与H5端相同，这样页面在不同端引入不同js后调用的方法名相同
 组件中调用时的写法可如下所示：（目前所有APP端的引入均注释，待后续开发）
 // #ifdef H5
 import localForage from 'localforage/src/localforage';
 import cimCom from '@/common/websocket/common.js';
 // #endif
 // #ifdef APP-PLUS
 import cimCom from '@/common/websocketApp/common.js';
 // #endif
 *
 */
import localForage from 'localforage/src/localforage';
import $http from '../http/interface.js';
import $store from '../../store/index.js';
import $json from '../../JsonConfig.js';
export default {
	msgUrl: $json.apiUrlPublic.msgUrl,
	historyChatList: [],
	historyGroupChatList: [],
	/**
	 * 查询客服列表
	 * @param {Object} vm
	 * 需要vue页面必须有:
	 * 字段: computed: chatList
	 * 方法: methods: setChatList
	 */ 
	async getServiceList (vm, bool, chatListParam) {
		// console.log('进入getChatList: ', 2);
		await $http.post('/member/getAllCustomerService').then((res) => {
			// console.log('进入getChatList的接口: ', 3);
			let {flag = '0', list = []} = res.data.data;
			if (list && list.length) {
				let chatList = [];
				for (let v of list) {
					chatList.push({
						uid: v.id,
						username: v.userName,
						face: v.shopImage,
						_msgNum: 0
					})
				}
				$store.commit('setChatList', chatList);
				// vm.setChatList(chatList);
				// TODO：20210310 - 以下情况暂未用到，后续开发完成视情况，如无地方用到直接去除
				if (bool) {
					vm[chatListParam] = chatList;
				}
			}
		}).catch(error => console.log(error));
		// console.log('准备退出getChatList: ', 4);
	},
	// 获取历史聊天列表
	async getHistoryChatList (vm) {
		let a = [];
		let pList = [];
		await localForage.getItem('mgsAllIds').then((value) => {
		  if (value) {
		    for (let v of value) {
					if (v.split(',')[1] == $store.getters.account) { // myuid
						a.push(v);
					}
		    }
		  }
		}).catch((err) => {
		  console.log(err);
		});
		for (let v of a) {
			await localForage.getItem(v).then((value2) => {
			  if (value2 && value2.length > 0) {
			    let obj = value2[value2.length - 1];
					let o = {
						_msgNum: 0,
						_msgTime: obj.time
					}
					if (obj.isSelf) {
						o['face'] = obj.face2;
						o['username'] = obj.username2;
						o['uid'] = obj.uid2;
					} else {
						o['face'] = obj.face;
						o['username'] = obj.username;
						o['uid'] = obj.uid;
					}
					// let idx = this.serviceIds.indexOf(`${o.uid}`);
					// if (idx != -1) {
					// 	o['personType'] = '1';
					// 	o['face'] = this.serviceFaces[idx];
					// } else {
					// 	o['personType'] = '2';
					// }
					pList.push(o);
			  }
			}).catch((err) => {
			  console.log(err);
			});
		}
		this.historyChatList = pList;
	},
	// 获取历史群聊对象list
	async getHistoryGroupChatList () {
		let a = [];
		let pList = [];
		// #ifdef H5
		await localForage.getItem('groupIds').then((value) => {
		  if (value) {
		    for (let v of value) {
					let ids = v.split(',');
					if (ids.indexOf($store.getters.account) != -1) {
						a.push(v);
					}
		    }
		  }
		}).catch((err) => {
		  console.log(err);
		});
		for (let v of a) {
			await localForage.getItem(v).then((value2) => {
			  if (value2 && value2.length > 0) {
			    let obj = value2[value2.length - 1];
					let o = {
						_msgNum: 0,
						_msgTime: obj.time,
						gId: obj.gId,
						uid: obj.uid,
						username:  obj.username,
						gName: obj.gName
					}
					
					pList.push(o);
			  }
			}).catch((err) => {
			  console.log(err);
			});
		}
		
		// #endif
		// // #ifdef APP-PLUS
		// let array = uni.getStorageSync('mgsAllIds');
		// if (array) {
		// 	for (let v of array) {
		// 	  if (v.split(',')[1] == this.myuid) {
		// 	  	a.push(v);
		// 			let value2 = uni.getStorageSync(v);
		// 			if (value2 && value2.length > 0) {
		// 			  let obj = value2[value2.length - 1];
		// 				let o = {
		// 					_msgNum: 0,
		// 					_msgTime: obj.time
		// 				}
		// 				if (obj.isSelf) {
		// 					o['face'] = obj.face2;
		// 					o['username'] = obj.username2;
		// 					o['uid'] = obj.uid2;
		// 				} else {
		// 					o['face'] = obj.face;
		// 					o['username'] = obj.username;
		// 					o['uid'] = obj.uid;
		// 				}
		// 				let idx = this.serviceIds.indexOf(`${o.uid}`);
		// 				if (idx != -1) {
		// 					o['personType'] = '1';
		// 					o['face'] = this.serviceFaces[idx];
		// 				} else {
		// 					o['personType'] = '2';
		// 				}
		// 				pList.push(o);
		// 			}
		// 	  }
		// 	}
		// }
		// // #endif
		
		this.historyGroupChatList = pList;
	},
	// 设置发现navbar未读消息数字角标值
	doSetUnreadMsg (num = 1) {
		const unreadMsg = $store.state.unreadMsg;
		$store.commit('setUnreadMsg', unreadMsg + num);
	},
	/**
	 * 收到的消息的处理: 根据页面判断哪些直接展示,哪些需要缓存,以及消息数量提示
	 * @param {Object} which 页面(chat/allNotice/notice/notice2/coupon/group)
	 * @param {Object} res 获取到的消息
	 * @param {Object} userId
	 * @param {Object} vm 当前页面对象
	 */
	async gotMessage (which, res, userId, vm) {
		let {receiver, sender, content, action, format, title, extra} = res;
		
		
		
			
		if (action === 'offLine') {
			let p2pList = [],
				groupInfoList = [],
				sysnoticeList = [],
				couponList = [],
				printmsgList = [],
				questionList = [],
				trendsList = [];
				
			let list = JSON.parse(content) || [];
			if (list.length > 0) {
				for (let obj of list) {
					let v = JSON.parse(obj);
					let {receiver, sender, content, action, format, title, extra} = v;
					if (action === 'p2p') {
						const message = JSON.parse(content);
						p2pList.push({
							id: message.id,
							uid: message.uid,
							username: message.username,
							face: message.face || 1,
							time: message.time,
							type: message.type,
							msg: message.msg,
							isSelf: false // 为false表示接收的别人发来的消息，用于获取历史聊天对象list时，头像昵称等要获取时对应的属性名（为false时正常取uid、username、face，为true时则取对应带2结尾的属性名，表示发送给别人这个人的信息）
						});
					} else if (action === 'group') {
						const message = JSON.parse(content);
						// groupInfos = JSON.parse(extra);
						groupInfoList.push({
							id: message.id,
							gId: message.gId,
							gName: message.gName,
							uid: message.uid,
							username: message.username,
							face: message.face || 1,
							time: message.time,
							type: message.type,
							msg: message.msg,
						});
					} else if (action === 'sysnotice') { // 系统通知消息
						const message = JSON.parse(content);
						sysnoticeList.push(message);
					} else if (action === 'coupon') { // 优惠劵 ，广告 等消息
						const message = JSON.parse(content);
						couponList.push(message);
					} else if (action === 'printmsg') { // 征订需求消息
						let message = JSON.parse(content);
						let spec = JSON.parse(extra);
						let str = '';
						for (let x in spec) {
							str += `${x}: ${spec[x]} `;
						}
						message['CommoditySpec'] = str;
						printmsgList.push(message);
					} else if (action === 'question') { // 动态 - 解答+回复
						let message = JSON.parse(content);
						questionList.push(message);
					} else {
						if (action == 2) {
							uni.showToast({
								icon: 'none',
								title: content
							});
						} else {
							// console.log('收到消息：', message);
						}
						return;
					}
				}
				if (p2pList.length > 0) {
					console.group('cimCom offline - p2pList')
					for (let v of p2pList) {
						await this.doLocalForage(v, v.uid, userId); // 存储聊天消息
						if (which === 'chat') { // 聊天页面, 页面展示新消息
							if (v.uid != vm.fromId) { // 当前聊天界面的聊天对象id不是接收到的消息发送人id
								await this.doLocalForageOutline(v, v.uid, userId); // 非聊天页面,存储未读消息
								this.doSetUnreadMsg(); // 设置发现navbar数字角标值
							} else {
								vm.screenMsg(v);
							}
						} else {
							await this.doLocalForageOutline(v, v.uid, userId); // 非聊天页面,存储未读消息
							if (which === 'allNotice') { // 发现页面: 修改对应某个客服消息的数字角标
								vm.setMsgDot(v, true);
							}
							// this.doSetUnreadMsg(); // 设置发现navbar数字角标值
						}
					}
					if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
						vm.setNavDot(p2pList.length);
					}
					if (which !== 'chat') { // 在非聊天界面, TabBar的数字角标值 + 聊天数量
						this.doSetUnreadMsg(p2pList.length); // 设置发现navbar数字角标值
					}
					console.groupEnd();
				}
				if (groupInfoList.length > 0) {
					console.group('cimCom offline - groupInfoList')
					for (let v of groupInfoList) {
						await this.doLocalForageGroup(v, userId); // 存储聊天消息
						if (which === 'group') { // 聊天页面, 页面展示新消息
							if (v.gId != vm.currentGroupId) { // 当前群聊界面的群id不是接收到的消息群id（group组件data对象必须存在该属性currentGroupId）
								await this.doLocalForageGroupOutline(v, userId); // 非当前群聊页面,存储未读消息
								this.doSetUnreadMsg(); // 设置发现navbar数字角标值
							} else {
								vm.screenMsg(v);
							}
						} else {
							await this.doLocalForageGroupOutline(v, userId); // 非聊天页面,存储未读消息
							if (which === 'allNotice') {
								vm.setGroupMsgDot(v, true); // 发现页面: 修改对应某个群聊消息的数字角标
							}
							// this.doSetUnreadMsg(); // 设置发现navbar数字角标值
						}
					}
					if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
						vm.setNavDot(groupInfoList.length);
					}
					
					if (which !== 'group') { // 在非聊天界面, TabBar的数字角标值 + 聊天数量
						this.doSetUnreadMsg(groupInfoList.length); // 设置发现navbar数字角标值
					}
					console.groupEnd();
				}
				if (sysnoticeList.length > 0) {
					for (let v of sysnoticeList) {
						if (which === 'notice') { // "系统通知"页面: 页面展示新通知
							vm['list'].push(v);
						} else {
							if (which === 'allNotice') {
								vm['sysnoticeList'].push(v); // 发现页面: 修改"系统通知"菜单的个数, 从而改变数字角标值
							}
							// this.doSetUnreadMsg(); // 设置发现navbar数字角标值
							await this.doLocalForageOutline2(v, 1, userId); // 非"系统通知"页面, 存储未读消息
						}
						await this.doLocalForage2(v, 1, userId); // 存储通知消息
					}
					if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
						vm.setNavDot(sysnoticeList.length);
					}
					
					if (which !== 'notice') { // 在非聊天界面, TabBar的数字角标值 + 聊天数量
						this.doSetUnreadMsg(sysnoticeList.length); // 设置发现navbar数字角标值
					}
				}
				if (couponList.length > 0) {
					for (let v of couponList) {
						if (which === 'coupon') { // "优惠券"页面: 页面展示新通知
							vm['list'].push(v);
						} else {
							if (which === 'allNotice') { // 发现页面: 修改"优惠券"菜单的个数, 从而改变数字角标值
								vm['couponList'].push(v);
							}
							// this.doSetUnreadMsg(); // 设置发现navbar数字角标值
							await this.doLocalForageOutline2(v, 3, userId); // 非"优惠券"页面, 存储未读消息
						}
						await this.doLocalForage2(v, 3, userId); // 存储通知消息
					}
					if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
						vm.setNavDot(couponList.length);
					}
					if (which !== 'coupon') { // 在非聊天界面, TabBar的数字角标值 + 聊天数量
						this.doSetUnreadMsg(couponList.length); // 设置发现navbar数字角标值
					}
				}
				if (printmsgList.length > 0) {
					for (let v of printmsgList) {
						if (which === 'notice2') { // "征订需求"页面: 页面展示新通知
							vm['list'].push(v);
						} else {
							if (which === 'allNotice') { // 发现页面: 修改"征订需求"菜单的个数, 从而改变数字角标值
								vm['printmsgList'].push(v);
							}
							// this.doSetUnreadMsg(); // 设置发现navbar数字角标值
							await this.doLocalForageOutline2(v, 2, userId); // 非"征订需求"页面, 存储未读消息
						}
						await this.doLocalForage2(v, 2, userId); // 存储通知消息
					}
					if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
						vm.setNavDot(printmsgList.length);
					}
					if (which !== 'notice2') { // 在非聊天界面, TabBar的数字角标值 + 聊天数量
						this.doSetUnreadMsg(printmsgList.length); // 设置发现navbar数字角标值
					}
				}
				if (questionList.length > 0) {
					for (let v of questionList) {
						await this.doLocalForageOutline2(v, 5, userId); // 不管当前页面, 存储评论点赞的消息,都是未读
					}
					if (which === 'allNotice') { // 发现页面: 修改动态navbar的数字角标值
						vm.setQuestionNavDot(questionList.length);
					}
					this.doSetUnreadMsg(questionList.length); // 设置发现navbar数字角标值
				}
			}
		} else {
			let p2pObj, groupObj, sysnoticeObj, couponObj, printmsgObj, questionObj, trendsObj;
			let groupInfos; // 群组信息
			if (action === 'p2p') {
				const message = JSON.parse(content);
				p2pObj = {
					id: message.id,
					uid: message.uid,
					username: message.username,
					face: message.face || 1,
					time: message.time,
					type: message.type,
					msg: message.msg,
					isSelf: false // 为false表示接收的别人发来的消息，用于获取历史聊天对象list时，头像昵称等要获取时对应的属性名（为false时正常取uid、username、face，为true时则取对应带2结尾的属性名，表示发送给别人这个人的信息）
				};
			} else if (action === 'group') {
				const message = JSON.parse(content);
				// groupInfos = JSON.parse(extra);
				groupObj = {
					id: message.id,
					gId: message.gId,
					gName: message.gName,
					uid: message.uid,
					username: message.username,
					face: message.face || 1,
					time: message.time,
					type: message.type,
					msg: message.msg,
				};
				// console.log(groupObj);
			} else if (action === 'sysnotice') { // 系统通知消息
				const message = JSON.parse(content);
				sysnoticeObj = message;
			} else if (action === 'coupon') { // 优惠劵 ，广告 等消息
				const message = JSON.parse(content);
				couponObj = message;
			} else if (action === 'printmsg') { // 征订需求消息
				let message = JSON.parse(content);
				let spec = JSON.parse(extra);
				let str = '';
				for (let x in spec) {
					str += `${x}: ${spec[x]} `;
				}
				message['CommoditySpec'] = str;
				printmsgObj = message;
			} else if (action === 'question') { // 动态 - 解答+回复
				let message = JSON.parse(content);
				questionObj = message;
			} else {
				if (action == 2) {
					uni.showToast({
						icon: 'none',
						title: content
					});
				} else {
					console.log('收到消息：', message);
				}
				return;
			}
			if (p2pObj) {
				const v = p2pObj;
				console.group('cimCom - p2pObj')
				await this.doLocalForage(v, v.uid, userId); // 存储聊天消息
				if (which === 'chat') { // 聊天页面, 页面展示新消息
					if (v.uid != vm.fromId) { // 当前聊天界面的聊天对象id不是接收到的消息发送人id
						await this.doLocalForageOutline(v, v.uid, userId); // 非聊天页面,存储未读消息
						
						this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					} else {
						vm.screenMsg(v);
					}
				} else {
					this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					await this.doLocalForageOutline(v, v.uid, userId); // 非聊天页面,存储未读消息
					if (which === 'allNotice') { 
						vm.setNavDot(1); // 发现页面: 修改消息tab的数字角标值 + 1
						vm.setMsgDot(v, true); // 发现页面: 修改对应某个客服消息的数字角标
					}
				}
				console.groupEnd();
			}
			// 群聊
			if (groupObj) {
				const v = groupObj;
				console.group('cimCom - groupObj')
				await this.doLocalForageGroup(v, userId); // 存储聊天消息
				if (which === 'group') { // 群聊页面, 页面展示新消息
					if (v.gId != vm.currentGroupId) { // 当前群聊界面的群id不是接收到的消息群id（group组件data对象必须存在该属性currentGroupId）
						await this.doLocalForageGroupOutline(v, userId); // 非当前群聊页面,存储未读消息
						this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					} else {
						vm.screenMsg(v);
					}
				} else {
					this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					await this.doLocalForageGroupOutline(v, userId); // 非群聊页面,存储未读消息
					if (which === 'allNotice') {
						vm.setNavDot(1); // 发现页面: 修改消息tab的数字角标值 + 1
						vm.setGroupMsgDot(v, true); // 发现页面: 修改对应某个群聊消息的数字角标
					}
				}
				console.groupEnd();
			}
			
			if (sysnoticeObj) {
				const v = sysnoticeObj;
				if (which === 'notice') { // "系统通知"页面: 页面展示新通知
					vm['list'].push(v);
				} else {
					if (which === 'allNotice') {
						vm['sysnoticeList'].push(v); // 发现页面: 修改"系统通知"菜单的个数, 从而改变数字角标值
						vm.setNavDot(1); // 发现页面: 修改消息tab的数字角标值
					}
					this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					await this.doLocalForageOutline2(v, 1, userId); // 非"系统通知"页面, 存储未读消息
				}
				await this.doLocalForage2(v, 1, userId); // 存储通知消息
			}
			if (couponObj) {
				const v = couponObj;
				if (which === 'coupon') { // "优惠券"页面: 页面展示新通知
					vm['list'].push(v);
				} else {
					if (which === 'allNotice') {
						vm['couponList'].push(v); // 发现页面: 修改"优惠券"菜单的个数, 从而改变数字角标值
						vm.setNavDot(1); // 发现页面: 修改消息tab的数字角标值
					}
					this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					await this.doLocalForageOutline2(v, 3, userId); // 非"优惠券"页面, 存储未读消息
				}
				await this.doLocalForage2(v, 3, userId); // 存储通知消息
			}
			if (printmsgObj) {
				const v = printmsgObj;
				if (which === 'notice2') { // "征订需求"页面: 页面展示新通知
					vm['list'].push(v);
				} else {
					if (which === 'allNotice') {
						vm['printmsgList'].push(v); // 发现页面: 修改"征订需求"菜单的个数, 从而改变数字角标值
						vm.setNavDot(1); // 发现页面: 修改消息tab的数字角标值
					}
					this.doSetUnreadMsg(); // 设置发现navbar数字角标值
					await this.doLocalForageOutline2(v, 2, userId); // 非"征订需求"页面, 存储未读消息
				}
				await this.doLocalForage2(v, 2, userId); // 存储通知消息
			}
			if (questionObj) {
				const v = questionObj;
				await this.doLocalForageOutline2(v, 5, userId); // 不管当前页面, 存储评论点赞的消息,都是未读
				if (which === 'allNotice') { // 发现页面: 修改动态tab的数字角标值
					vm.setQuestionNavDot(1);
				} else {
					this.doSetUnreadMsg(); // 设置发现navbar数字角标值
				}
			}
		}
		try {
			let app = document.getElementById('app');
			let b=document.getElementById('bgMusic');
			if (b) {
				app.removeChild(b);
			}
			// 语音提示消息
			let $audio = document.createElement('audio');
			$audio.setAttribute('src', '../../static/voice/message.mp3');
			$audio.setAttribute('id', 'bgMusic');
			$audio.setAttribute('autoplay', true);
			app.appendChild($audio);
			app.removeChild($audio);
			document.body.appendChild($audio);
		} catch (err) {
			
		}
		
	},
	
	/**
	 * 存储聊天消息
	 * 不区分是否已读, 页面展示: 存储到本地 - 所有 "聊天消息" (mgsAllIds)
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} fromId 聊天对象的id
	 * @param {Object} userId 本人id
	 */
	async doLocalForage(obj, fromId, userId) {
		let indexDBMsgList = [];
		let msgAllIds = [];
		localForage.getItem('mgsAllIds').then((value) => {
			if (value) {
				msgAllIds = value;
			}
			if (msgAllIds.indexOf(`${fromId},${userId}`) === -1) {  // 存储新的聊天对象
				msgAllIds.push(`${fromId},${userId}`);
				localForage.setItem('mgsAllIds', msgAllIds);
			}
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.getItem(`${fromId},${userId}`).then((value) => { // 获取已存储的聊天内容,再加入新的聊天信息
			// 当离线仓库中的值被载入时，此处代码运行
			// console.log('indexDBMsgList: ', value);
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(`${fromId},${userId}`, indexDBMsgList).then((value) => {
				// 当值被存储后，可执行其他操作
				// console.log(value);
			}).catch((err) => {
				// 当出错时，此处代码运行
				console.log(err);
			});
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
	},
	/**
	 * 存储群聊消息
	 * 不区分是否已读, 页面展示: 存储到本地 - 所有 "聊天消息" (groupIds)
	 * @param {Object} obj 要存储的某条信息（gId: 群id， uid：当前消息的发送者id）
	 * @param {Object} userId 本人id
	 * @param {Object} groupInfos 聊天信息 - 暂未用到
	 */
	async doLocalForageGroup(obj, userId, groupInfos) {
		const gId = obj.gId; // 群id
		// const fromId = obj.uid; // 发送者id
		let indexDBMsgList = [];
		let groupIds = [];
		localForage.getItem('groupIds').then((value) => {
			if (value) {
				groupIds = value;
			}
			if (groupIds.indexOf(`${gId}`) === -1) {  // 存储新的聊天对象
				groupIds.push(`${gId}`);
				localForage.setItem('groupIds', groupIds);
			}
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.getItem(`${gId}`).then((value) => { // 获取已存储的聊天内容,再加入新的聊天信息
			// 当离线仓库中的值被载入时，此处代码运行
			// console.log('indexDBMsgList: ', value);
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(`${gId}`, indexDBMsgList).then((value) => {
				// 当值被存储后，可执行其他操作
				// console.log(value);
			}).catch((err) => {
				// 当出错时，此处代码运行
				console.log(err);
			});
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
	},
	/**
	 * 存储其他消息
	 * 不区分是否已读, 页面展示: 存储到本地 - 除聊天消息外的 "其他消息"
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} type 区分哪种消息 [ 1 - 系统；2 - 征订；3 - 优惠； ]
	 * @param {Object} userId 本人id
	 */
	async doLocalForage2 (obj, type = 1, userId) {
		let indexDBMsgList = [];
		let keyStr = `${userId}_notices`;
		if (type === 2) {
			keyStr = `${userId}_overprintNotices`;
		} else if (type === 3) {
			keyStr = `${userId}_coupon`;
		}
		await localForage.getItem(keyStr).then((value) => {
			// 当离线仓库中的值被载入时，此处代码运行
			// console.log('indexDBMsgList: ', value);
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(keyStr, indexDBMsgList).then((value) => {
				// console.log(value);
			}).catch((err) => {
				console.log(err);
			});
		}).catch((err) => {
			console.log(err);
		});
	},
	/**
	 * 存储-未读的-聊天消息
	 * 未读消息: 存储到本地 - 未读的 "聊天消息" (mgsAllIdsOutline)
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} fromId 聊天对象的id
	 * @param {Object} userId 本人id
	 */
	async doLocalForageOutline(obj, fromId, userId) {
		// console.log(2222, '存储-未读的-聊天消息：[fromId, userId]:', fromId, userId);
		let indexDBMsgList = [];
		let mgsAllIdsOutline = [];
		localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				mgsAllIdsOutline = value;
			}
			if (mgsAllIdsOutline.indexOf(`outline_${fromId},${userId}`) === -1) { // 存储新的聊天对象
				mgsAllIdsOutline.push(`outline_${fromId},${userId}`);
				localForage.setItem('mgsAllIdsOutline', mgsAllIdsOutline);
			}
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.getItem(`outline_${fromId},${userId}`).then((value) => { // 获取已存储的聊天内容,再加入新的聊天信息
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.setItem(`outline_${fromId},${userId}`, indexDBMsgList).then((value) => {
			// 当值被存储后，可执行其他操作
			// console.log(value);
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
	},
	/**
	 * 存储-未读的-群聊消息
	 * 未读消息: 存储到本地 - 未读的 "群聊消息" (groupIdsOutline， outline_${gId})
	 * @param {Object} obj 要存储的某条信息（gId: 群id， uid：当前消息的发送者id）
	 * @param {Object} userId 本人id
	 */
	async doLocalForageGroupOutline(obj, userId) {
		const gId = obj.gId; // 群id
		const fromId = obj.uid; // 发送者id
		let indexDBMsgList = [];
		let groupIdsOutline = [];
		await localForage.getItem('groupIdsOutline').then((value) => {
			if (value) {
				groupIdsOutline = value;
			}
			if (groupIdsOutline.indexOf(`outline_${gId}`) === -1) { // 存储新的群聊id
				groupIdsOutline.push(`outline_${gId}`);
				// localForage.setItem('groupIdsOutline', groupIdsOutline);
			}
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.setItem('groupIdsOutline', groupIdsOutline);
		await localForage.getItem(`outline_${gId}`).then((value) => { // 获取已存储的群聊天内容,再加入新的聊天信息
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.setItem(`outline_${gId}`, indexDBMsgList).then((value) => {
			// 当值被存储后，可执行其他操作
			// console.log(value);
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
	},
	/**
	 * 存储-未读的-其他消息
	 * 未读消息: 存储到本地 - 未读的除聊天消息外的 "其他消息"
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} type 区分哪种消息 [ 1 - 系统；2 - 征订；3 - 优惠；4 - 评论点赞；5 - 解答回复 ]
	 * @param {Object} userId 本人id
	 */
	async doLocalForageOutline2 (obj, type = 1, userId) {
		let indexDBMsgList = [];
		let keyStr = `${userId}_notices_outline`; // 系统
		if (type === 2) { // 征订
			keyStr = `${userId}_overprintNotices_outline`;
		} else if (type === 3) { // 优惠
			keyStr = `${userId}_coupon_outline`;
		} else if (type === 4) { // 评论点赞
			keyStr = `${userId}_trends_outline`;
		} else if (type === 5) { // 解答回复
			keyStr = `${userId}_question_outline`;
		}
		await localForage.getItem(keyStr).then((value) => {
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(keyStr, indexDBMsgList).then((value) => {
				// console.log(value);
			}).catch((err) => {
				console.log(err);
			});
		}).catch((err) => {
			console.log(err);
		});
	},
	/**
	 * 获取 - 评论点赞 未读信息个数 - 已不用
	 * @param {Object} vm
	 * computed: userInfo
	 * 返回 数量
	 */
	async getTrendMsgsUnreadMsgNum (vm) {
		let a = [];
		await localForage.getItem(`${vm.userInfo.userId}_trends_outline`).then((value) => {
			if (value && value.length > 0) {
				a = value;
			// 	this.navList.splice(0, 1, {
			// 		text: '动态',
			// 		num: value.length
			// 	});
			// 	this.setUnreadMsg(this.unreadMsg + value.length);
			// } else {
			// 	this.navList.splice(0, 1, {
			// 		text: '动态',
			// 		num: 0
			// 	});
			}
		}).catch((err) => {
			console.log(err);
		});
		return a.length;
	},
	/**
	 * 获取 - 解答回复 未读信息个数
	 * @param {Object} vm
	 * computed: userInfo
	 * 返回 数量
	 */
	async getQuestionMsgsUnreadMsgNum (vm) {
		let a = [];
		await localForage.getItem(`${vm.userInfo.userId}_question_outline`).then((value) => {
			if (value && value.length > 0) {
				a = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		return a.length;
	},
	/**
	 * 获取 - 系统通知+优惠券+征订需求 未读信息个数
	 * @param {Object} vm
	 * @param {Object} from_allNotice 页面是否定义有三个菜单栏的数据list, 字段名固定见下方data说明
	 * computed: userInfo
	 * data: sysnoticeList \ printmsgList \ couponList
	 * 返回 数量
	 */
	async getNoticesUnreadMsgNum (vm, from_allNotice) {
		let s = 0;
		await localForage.getItem(`${vm.userInfo.userId}_notices_outline`).then((value) => {
			if (value && value.length > 0) {
				s += value.length;
				if (from_allNotice) {
					let list = vm.sysnoticeList.concat(value);
					vm.sysnoticeList = list;
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${vm.userInfo.userId}_overprintNotices_outline`).then((value) => {
			if (value && value.length > 0) {
				s += value.length;
				if (from_allNotice) {
					let list = vm.printmsgList.concat(value);
					vm.printmsgList = list;
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${vm.userInfo.userId}_coupon_outline`).then((value) => {
			if (value && value.length > 0) {
				s += value.length;
				if (from_allNotice) {
					let list = vm.couponList.concat(value);
					vm.couponList = list;
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		return s;
	},
	/**
	 * 获取 - 聊天信息 未读信息个数
	 * @param {Object} vm
	 * @param {Object} from_allNotice 页面有区别于store里的客服列表字段, 字段名固定见下方data说明
	 * computed: userInfo / chatList
	 * data: pageChatList
	 * 返回 数量
	 */
	async getChatMsgUnreadMsgNum (vm, from_allNotice, from_App) {
		let s = 0;
		let mgsAllIdsOutlineList = [];
		await localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				mgsAllIdsOutlineList = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		if (from_allNotice) {
			for (let v of vm.pageChatList) {
				if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${vm.userInfo.userId}`) !== -1) {
					await localForage.getItem(`outline_${v.uid},${vm.userInfo.userId}`).then((value) => {
						if (value && value.length > 0) {
							v._msgNum = value.length;
							v._msgTime = value[value.length - 1]['time'];
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		} else if (from_App) { // 从App.vue 初始化项目时获取的历史聊天记录来获取可能的未读消息（App-进入历史聊天未读消息查询）
			for (let v of this.historyChatList) {
				if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${$store.getters.account}`) !== -1) {
					await localForage.getItem(`outline_${v.uid},${$store.getters.account}`).then((value) => {
						if (value && value.length > 0) {
							v._msgNum = value.length;
							v._msgTime = value[value.length - 1]['time'];
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		} else {
			for (let v of vm.chatList) {
				if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${vm.userInfo.userId}`) !== -1) {
					await localForage.getItem(`outline_${v.uid},${vm.userInfo.userId}`).then((value) => {
						if (value && value.length > 0) {
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		}
		return s;
	},
	/**
	 * 获取 - 群聊信息 未读信息个数
	 * @param {Object} vm
	 * @param {Object} from_allNotice 页面有区别于store里的客服列表字段, 字段名固定见下方data说明
	 * computed: userInfo / chatList
	 * data: pageChatList
	 * 返回 数量
	 */
	async getGroupMsgUnreadMsgNum (vm, from_allNotice, from_App) {
		let s = 0;
		let groupIdsOutlineList = [];
		await localForage.getItem('groupIdsOutline').then((value) => {
			console.log('groupIdsOutline', value);
			if (value) {
				groupIdsOutlineList = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		if (from_allNotice) {
			console.log('pageGroupList', vm.pageGroupList);
			for (let v of vm.pageGroupList) {
				console.log('v', v, `outline_${v.gId}`);
				if (groupIdsOutlineList.indexOf(`outline_${v.gId}`) !== -1) {
					await localForage.getItem(`outline_${v.gId}`).then((value) => {
						if (value && value.length > 0) {
							v._msgNum = value.length;
							v._msgTime = value[value.length - 1]['time'];
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		}
		//  else if (from_App) { // 从App.vue 初始化项目时获取的历史聊天记录来获取可能的未读消息（App-进入历史聊天未读消息查询）
		// 	for (let v of this.historyGroupChatList) {
		// 		if (groupIdsOutlineList.indexOf(`outline_${v.gId}`) !== -1) {
		// 			await localForage.getItem(`outline_${v.gId}`).then((value) => {
		// 				if (value && value.length > 0) {
		// 					v._msgNum = value.length;
		// 					v._msgTime = value[value.length - 1]['time'];
		// 					s += value.length;
		// 				}
		// 			}).catch((err) => {
		// 				console.log(err);
		// 			});
		// 		}
		// 	}
		// }
		 else {
			if (!from_App) {
				await this.getHistoryGroupChatList();
			}
			for (let v of this.historyGroupChatList) {
				if (groupIdsOutlineList.indexOf(`outline_${v.gId}`) !== -1) {
					await localForage.getItem(`outline_${v.gId}`).then((value) => {
						if (value && value.length > 0) {
							v._msgNum = value.length;
							v._msgTime = value[value.length - 1]['time'];
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		}
		return s;
	},
	
	/**
	 * 设置TabBar数字角标值
	 * @param {Object} vm
	 * computed: userInfo / chatList
	 * methods: setUnreadMsg
	 */
	async setUnreadMsgAll (vm, from_App = false) {
		let a1, a2, a3, a4, a5;
		// a1 = await this.getTrendMsgsUnreadMsgNum(vm);
		a4 = await this.getQuestionMsgsUnreadMsgNum(vm);
		a2 = await this.getNoticesUnreadMsgNum(vm);
		if (from_App) {
			a3 = await this.getChatMsgUnreadMsgNum(vm, false, true);
			a5 = await this.getGroupMsgUnreadMsgNum(vm, false, true);
		} else {
			a3 = await this.getChatMsgUnreadMsgNum(vm);
			a5 = await this.getGroupMsgUnreadMsgNum(vm);
		}
	
		// let s = a1 + a2 + a3;
		let s = a4 + a2 + a3 + a5;
		vm.setUnreadMsg(s);
	},
	
	
	
	async getNoticeUnreadMsg (userId, vm) {
		let s = 0;
		await localForage.getItem(`${userId}_notices_outline`).then((value) => {
			// console.log('getIndexDBMsg: ', value);
			if (value && value.length > 0) {
				s += value.length;
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${userId}_overprintNotices_outline`).then((value) => {
			// console.log('getIndexDBMsg: ', value);
			if (value && value.length > 0) {
				s += value.length;
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${userId}_coupon_outline`).then((value) => {
			// console.log('getIndexDBMsg: ', value);
			if (value && value.length > 0) {
				s += value.length;
			}
		}).catch((err) => {
			console.log(err);
		});
		vm.setUnreadMsg(s);
	},
	

	
	
	/**
	 * 查看未读消息
	 * @param {Object} vm
	 * 需要vue页面必须有:
	 * 字段: chatList / userInfo / unreadMsg
	 * 方法: setUnreadMsg / 
	 */ 
	async getIndexDBMsg2 (vm) {
		let mgsAllIdsOutlineList = [];
		await localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				mgsAllIdsOutlineList = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		for (let v of vm.chatList) {
			if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${vm.userInfo.userId}`) !== -1) {
				await localForage.getItem(`outline_${v.uid},${vm.userInfo.userId}`).then((value) => {
					if (value && value.length > 0) {
						v._msgNum = value.length;
						vm.setUnreadMsg(vm.unreadMsg + value.length);
					}
				}).catch((err) => {
					console.log(err);
				});
			}
		}
	},
	
	
	
	
	// 删除未读单聊消息
	async doRemoveOutlineChat (fromId, userId) {
		// #ifdef H5
		const id = `outline_${fromId},${userId}`;
		await localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				if (value.indexOf(id) != -1) {
					value.splice(value.indexOf(id), 1);
					localForage.setItem('mgsAllIdsOutline', value);
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.removeItem(id).then(() => {}).catch((err) => {});
		// #endif
		// #ifdef APP-PLUS
		let array = uni.getStorageSync('mgsAllIdsOutline');
		if (array && array.indexOf(id) != -1) {
			array.splice(array.indexOf(id), 1);
			uni.setStorageSync('mgsAllIdsOutline', array);
		}
		uni.removeStorageSync(id);
		// #endif
	},
	// 删除未读群聊消息
	async doRemoveOutlineGroup (gId) {
		// #ifdef H5
		const id = `outline_${gId}`;
		await localForage.getItem('groupIdsOutline').then((value) => {
			if (value) {
				if (value.indexOf(id) != -1) {
					value.splice(value.indexOf(id), 1);
					localForage.setItem('groupIdsOutline', value);
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.removeItem(id).then(() => {}).catch((err) => {});
		// #endif
		// #ifdef APP-PLUS
		let array = uni.getStorageSync('groupIdsOutline');
		if (array && array.indexOf(id) != -1) {
			array.splice(array.indexOf(id), 1);
			uni.setStorageSync('groupIdsOutline', array);
		}
		uni.removeStorageSync(id);
		// #endif
	}
}